Windows Forms - Funções auxiliares do Microsoft SQL Server
Se você já construiu uma querie longa e se perdeu nos campos e números de parâmetros esta função
irá ajudar você.
Ela lista o nome do campo e o valor atribuido a ele numa querie sql.
Module SQL
Função para decompor uma querie select com muitos campos e valores
Public Function DecompoeQuerie(Querie As String) As List(Of String)
Dim a As Integer 'varre caractere por caractere da querie
Dim b As String 'parte da query desmembrada
Dim campos(1000) As String 'campos do insert
Dim dados(1000) As String 'parametros recebidos
Dim pnt1 As Integer = 0 'aponta para campos() e dados()
Dim pnt2 As Integer = 0 'aponta para campos() e dados()
Dim flg_apostrofo As Boolean 'flag dentro de apóstrofo-desconsiderar vírgulas
Dim flg_abreparenteses As Boolean 'flag dentro de apóstrofo-desconsiderar vírgulas
Dim c As String 'caractere da querie
Dim retorno As New List(Of String) 'retorno
'separando a parte inicial - até o abre parenteses - todos os campos num único string
a = 1
b = ""
c = Mid(Querie, a, 1)
While c <> "("
b = b + c
a = a + 1
c = Mid(Querie, a, 1)
End While
b = b + Mid(Querie, a, 1)
'frmQuerieDecomposta.ListBox1.Items.Add(b) 'insert into tabela(
'separando os dados - todos os dados da querie num único string
a = a + 1
b = ""
pnt1 = 0
c = Mid(Querie, a, 1)
While c <> ")"
b = b + c
If c = "," Then
b = Strings.Left(b, Len(b) - 1)
campos(pnt1) = b
pnt1 = pnt1 + 1
b = ""
End If
a = a + 1
c = Mid(Querie, a, 1)
End While
'separando a parte intermediaria - ) values ( - insert into tabela(campos) values (
b = ""
c = Mid(Querie, a, 1)
While c <> "("
b = b + c
a = a + 1
c = Mid(Querie, a, 1)
End While
b = b + c
a = a + 1
'frmQuerieDecomposta.ListBox1.Items.Add(b) ') values (
flg_apostrofo = False 'flag dentro de apóstrofo-desconsiderar vírgulas
flg_abreparenteses = False 'flag dentro de apóstrofo-desconsiderar vírgulas
'separando os parametros
b = ""
pnt2 = 0
c = Mid(Querie, a, 1)
While c <> ")" Or (flg_apostrofo = True) Or (flg_abreparenteses = True)
b = b + c
'verificando as vírgulas - só contabilizar virgulas se estiver fora de 'Endereço x,x,x,' e convert(x,x,x)
If (flg_apostrofo = False) And (flg_abreparenteses = False) Then
If c = "," Then
b = Strings.Left(b, Len(b) - 1)
dados(pnt2) = b
pnt2 = pnt2 + 1
b = ""
End If
End If
'verificando abre parenteses
If c = "(" Then
flg_abreparenteses = True
End If
If Mid(Querie, a, 1) = ")" Then
flg_abreparenteses = False
End If
'verificando apostrofe
If c = "'" Then
If flg_apostrofo Then
flg_apostrofo = False
Else
flg_apostrofo = True
End If
End If
a = a + 1
c = Mid(Querie, a, 1)
End While
'verificando se o número de campos bate com o número de parametros
If pnt1 <> pnt2 Then
b = "Falha : Foram encontrados : " + CStr(pnt1) + " campos e " + CStr(pnt2) + " parâmetros"
MsgBox(b)
'frmQuerieDecomposta.ListBox1.Items.Add(b)
If pnt2 > pnt1 Then
pnt1 = pnt2
End If
End If
'preparando o resultado
retorno.Clear()
For a = 0 To pnt1 - 1
b = CStr(a) + vbTab + campos(a) + vbTab + dados(a)
retorno.Add(b)
Next
Return retorno
End Function
End Module